home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 40
/
Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso
/
Aminet
/
misc
/
emu
/
ATUtilities.lha
/
ATUtilities
/
FILE.ASM
< prev
next >
Wrap
Assembly Source File
|
2000-09-26
|
17KB
|
570 lines
code segment
assume cs:code,ds:code,es:code,ss:code
org 0
befehl equ 2
status equ 3
end_adr equ 14
file_befehle equ 20
cmd equ 16384
arg1 equ cmd+0
arg2 equ cmd+2
arg3 equ cmd+4
arg4 equ cmd+6
arg5 equ cmd+8
arg6 equ cmd+10
arg7 equ cmd+12
arg8 equ cmd+14
buf_seg equ 22 ; DualPortedRAM->BufferRAM.PCSegment
reg_bp equ 22
reg_sp equ 20
reg_ss equ 18
reg_cs equ 16
reg_es equ 14
reg_di equ 12
reg_ds equ 10
reg_si equ 8
reg_dx equ 6
reg_cx equ 4
reg_bx equ 2
reg_ax equ 0
erst_b equ this byte
filetreiber:
dw -1,-1 ; DOS-Intern
db 0,80h ; Flags
soffset dw offset strat ; Strategie-Routine
ioffset dw offset intr ; Interrupt-Routine
db "$FILE000" ; File-Kennung
janus_seg dw (?)
janus_ofs dw (?)
db_ptr dw (?),(?)
cmd_tab:
dw offset amiga ; #00
dw offset amiga ; #01
dw offset amiga ; #02
dw offset amiga ; #03
dw offset copy_to_janus ; #04
dw offset copy_to_pc ; #05
dw offset get_adr ; #06
dw offset amiga ; #07
dw offset fill ; #08
dw offset amiga ; #09
dw offset amiga ; #10
dw offset amiga ; #11
dw offset amiga ; #12
dw offset amiga ; #13
dw offset amiga ; #14
dw offset amiga ; #15
dw offset amiga ; #16
dw offset amiga ; #17
dw offset amiga ; #18
dw offset amiga ; #19
dummy proc far
ret
dummy endp
; ************ Interrupt für Vektor $49
fileint proc far
push bp
push sp
push ss
push cs
push es
push di
push ds
push si
push dx
push cx
push bx
push ax
mov bp,sp
push cs
pop ds
mov di,cs:janus_ofs
mov es,cs:janus_seg
cmp ah,file_befehle
jge fehler
push ax
mov al,ah
shl al,1
xor ah,ah
mov si,ax
pop ax
call [cmd_tab+si]
jmp okay
fehler:
mov w[bp+reg_bx],7500
okay:
pop ax
pop bx
pop cx
pop dx
pop si
pop ds
pop di
pop es
pop bp
pop bp
pop bp
pop bp
iret
fileint endp
call_and_wait proc near
mov ah,7
mov al,26
int 0b
mov ah,8
mov al,26
int 0b
ret
call_and_wait endp
copy_to_janus proc near
mov ds,bx
mov si,dx
rep movsb
ret
copy_to_janus endp
copy_to_pc proc near
push ds
mov ds,cs:janus_seg
mov si,cs:janus_ofs
mov es,bx
mov di,dx
rep movsb
pop ds
ret
copy_to_pc endp
fill proc near
mov es,bx
mov di,dx
fill_loop:
mov es:b[di],al
add di,1
loop fill_loop
ret
fill endp
get_adr proc near
mov w[bp+reg_es],cs:janus_seg
mov w[bp+reg_di],cs:janus_ofs
ret
get_adr endp
amiga proc near
mov al,ah
xor ah,ah
mov es:w[di+arg1],ax
mov es:w[di+arg2],bx
mov es:w[di+arg3],cx
mov es:w[di+arg4],dx
call near call_and_wait
mov w[bp+reg_bx],es:w[di+arg2]
mov w[bp+reg_cx],es:w[di+arg3]
mov w[bp+reg_dx],es:w[di+arg4]
ret
amiga endp
; ************ Ende des Treibers ***********
ende equ this byte
; ************ Interruptroutine des Treibers
intr proc far
push ax
push bx
push cx
push dx
push di
push si
push bp
push ds
push es
pushf
push cs
pop ds
les di,dword ptr db_ptr
mov bl,es:[di+befehl]
cmp bl,0
je bc_okay
mov ax,8003h
jmp short intr_end
bc_okay:
call init
intr_end label near
or ax,0100h
mov es:[di+status],ax
popf
pop es
pop ds
pop bp
pop si
pop di
pop dx
pop cx
pop bx
pop ax
ret
intr endp
strat proc far
mov cs:db_ptr,bx
mov cs:db_ptr+2,es
ret
start endp
; ************ Installationsroutine
init proc near
mov word ptr es:[di+end_adr],offset ende
mov word ptr es:[di+end_adr+2],cs
mov dx,offset initm ; Installationsmeldung ausgeben
mov ah,9
int 21h
push di ; Verbindung zum Amiga herstellen
push es
push ds
mov ah,1
mov al,26
int 0b
cmp di,-1
je init_fehler
mov janus_ofs,di
mov janus_seg,es:w[buf_seg]
mov es,es:w[buf_seg]
mov es:w[di+arg1],1000
call near call_and_wait
pop ds
pop es
pop di
mov ah,25h ; File-Interrupt einbinden
mov al,049
mov dx,offset fileint
int 21h
mov ioffset,offset dummy
mov soffset,offset dummy
mov dx,offset sokay ; Treiber erfolgreich installiert
mov ah,9
int 21h
xor ax,ax
init_ende:
ret
init_fehler:
pop ds
pop es
pop di
mov dx,offset kserv
mov ah,9
int 21h
mov ax,1
mov word ptr es:[di+end_adr],offset filetreiber
mov word ptr es:[di+end_adr+2],cs
jmp near init_ende
init endp
texte equ 12
text_tab:
dw offset exe_t
dw offset info1
dw offset info2
dw offset info3
dw offset info4
dw offset info5
dw offset info6
dw offset info7
dw offset info8
dw offset info9
dw offset info10
dw offset info11
dw offset info12
exe_start proc far
push cs
pop ds
mov bx,0
ausgabe:
push bx
shl bx,1
mov dx,[text_tab+bx]
mov ah,9
int 21h
xor ax,ax
int 16h
pop bx
add bx,1
cmp bx,texte
jle ausgabe
mov ax,4c00
int 21h
exe_start endp
; ************ Installationsmeldungen beim Start
initm db "ATUtilities File Transfer - Version 2.0 17. September 1993",13,10
db "Copyright (C) 1993 by Thomas Dreibholz. All rights reserved.",13,10,"$"
sokay db "Treiber wurde erfolgreich installiert.",13,10,10,"$"
kserv db "Amiga-Treiber an Janus-Interrupt 26 ist nicht aktiv.",13,10
db "Treiber konnte nicht installiert werden.",13,10,10,"$"
exe_t db "ATUtilities File Transfer:",13,10
db "Dieses Programm ist ein Treiber und kann deshalb nicht direkt aufgerufen",13,10
db "werden. Um den Treiber zu Installieren, muß folgende Zeile in die CONFIG.SYS",13,10
db "eingefügt werden:",13,10,10
db "DEVICE=Lw:\Verz\FILE.EXE",13,10,10
db "Nach dem nächsten Reset stehen dann die Funktionen zur Verfügung.",13,10,10,10
db "File Transfer ermöglicht es, von einem Programm auf der AT-Karte Dateien",13,10
db "und Verzeichnisse auf dem Amiga zu bearbeiten. Zum Aufruf der Funktionen",13,10
db "wird das Programm auf Interrupt-Verktor 49h installiert und kann somit von",13,10
db "allen Sprachen aufgerufen werden, die direkte Interruptprogrammierung unter-",13,10
db "stützen.",13,10,10
db "Datei- und Verzeichnisnamen sowie Daten werden dem Interrupt im Parameter-",13,10
db "speicher des Janus-Interrupt 26 (der Interrupt zur Kommunikation mit dem Amiga)",13,10
db "übergeben. Die Adresse dieses Speichers kann mit der Funktion 6 ermittelt",13,10
db "werden.",13,10,10
db "17. 09. 1993 - Version 2.0 Copyright (C) 1993 by Thomas Dreibholz",13,10,10
db "<< Taste >>",13,10,"$"
info1 db "Beschreibung des File Transfer-Interrupts auf Vektor 49h: - Seite 1",13,10,10
db "Öffnen einer Amiga-Datei (Open):",13,10
db " AH = 0",13,10
db " BX = Zugriffsmodus",13,10
db " 1 = Lesen",13,10
db " 2 = Schreiben",13,10
db " 3 = Lesen und Schreiben",13,10
db " Name der Datei im Parameter-Speicher des Janus-Interrupt 26",13,10,10
db " BX = Fehlernummer",13,10
db " 10000 = Okay",13,10
db " <> 10000 = Fehler",13,10
db " CX = Handle-Nummer",13,10,10,10
db "Datei schließen (Close):",13,10
db " AH = 1",13,10
db " BX = Handlenummer",13,10,10,10,10,10
db "<< Taste >>",13,10,"$"
info2 db "Beschreibung des File Transfer-Interrupts auf Vektor 49h: - Seite 2",13,10,10
db "Aus Datei lesen (Read):",13,10
db " AH = 2",13,10
db " BX = Handlenummer",13,10
db " CX = Anzahl der zu lesenden Bytes",13,10,10
db " Daten im Parameter-Speicher des Janus-Interrupt 26",13,10
db " BX = Anzahl der gelesenen Bytes",13,10,10,10
db "In Datei schreiben (Write):",13,10
db " AH = 3",13,10
db " BX = Handlenummer",13,10
db " CX = Länge des Datenblocks",13,10
db " Daten im Parameter-Speicher des Janus-Interrupt 26",13,10,10
db " BX = Anzahl der geschriebenen Bytes",13,10,10,10,10,10,10
db "<< Taste >>",13,10,"$"
info3 db "Beschreibung des File Transfer-Interrupts auf Vektor 49h: - Seite 3",13,10,10
db "PC-Speicher in Janus-Speicher kopieren:",13,10
db " AH = 4",13,10
db " BX = Segment",13,10
db " DX = Offset",13,10
db " CX = Länge",13,10,10,10
db "Janus-Speicher in PC-Speicher kopieren:",13,10
db " AH = 5",13,10
db " BX = Segment",13,10
db " DX = Offset",13,10
db " CX = Länge",13,10,10,10
db "Adresse des Parameter-Speicher von Janus-Interrupt 26 ermitteln",13,10
db " AH = 6",13,10,10
db " ES = Segment",13,10
db " DI = Offset",13,10,10,10
db "<< Taste >>",13,10,"$"
info4 db "Beschreibung des File Transfer-Interrupts auf Vektor 49h: - Seite 4",13,10,10
db "Position in Datei ändern (Seek):",13,10
db " AH = 7",13,10
db " BX = Handlenummer",13,10
db " CX = Position",13,10
db " DX = Positionsmodus",13,10
db " 0 = CX Bytes vom Anfang der Datei",13,10
db " 1 = CX Bytes von der aktuellen Position",13,10
db " 2 = CX Bytes vom Ende der Datei",13,10,10
db " BX = Seek() ausgeführt",13,10
db " 10000 = Okay",13,10
db " <> 10000 = Ungültiger Handle",13,10
db " Rückgabewert von Seek() als DWORD im Parameter-Speicher von",13,10
db " Janus-Interrupt 26",13,10,10,10,10,10,10,10,10
db "<< Taste >>",13,10,"$"
info5 db "Beschreibung des File Transfer-Interrupts auf Vektor 49h: - Seite 5",13,10,10
db "Speicherbereich mit Zeichen füllen:",13,10
db " AH = 8",13,10
db " AL = Füllzeichen",13,10
db " BX = Segment",13,10
db " DX = Offset",13,10
db " CX = Länge",13,10,10,10
db "Datei löschen (DeleteFile):",13,10
db " AH = 9",13,10
db " Name der Datei im Parameter-Speicher von Janus-Interrupt 26",13,10,10
db " BX = DeleteFile() ausgeführt",13,10
db " 10000 = Okay",13,10
db " <> 10000 = Fehler",13,10,10,10,10,10,10,10
db "<< Taste >>",13,10,"$"
info6 db "Beschreibung des File Transfer-Interrupts auf Vektor 49h: - Seite 6",13,10,10
db "AmigaDOS-Fehlernummer ermitteln (IoErr):",13,10
db " AH = 10",13,10,10
db " BX = Fehlernummer",13,10,
db " 202 = Objekt wird gerade benutzt",13,10
db " 203 = Objekt existiert bereits",13,10
db " 204 = Verzeichnis nicht gefunden",13,10
db " 205 = Objekt nicht gefunden",13,10
db " 210 = Dateiname ist ungültig (zu lang oder mit unerlaubten Zeichen)",13,10
db " 213 = Diskette/Festplatte ist im Validating-Zustand",13,10
db " 214 = Diskette ist schreibgeschützt",13,10
db " 215 = Rename nur innerhalb einer Diskette/Festplatte möglich",13,10
db " 216 = Verzeichnis ist nicht leer",13,10
db " 219 = Seek()-Fehler: Ungültige Parameter",13,10
db " 221 = Diskette/Festplatte ist voll",13,10
db " 222 = Datei ist gegen Löschen geschützt",13,10
db " 223 = Datei ist gegen Überschreiben geschützt",13,10
db " 224 = Datei ist gegen Lesen geschütuzt",13,10
db " 226 = Keine Diskette eingelegt",13,10,10,10
db "<< Taste >>",13,10,"$"
info7 db "Beschreibung des File Transfer-Interrupts auf Vektor 49h: - Seite 7",13,10,10
db "Verzeichnis laden",13,10
db " AH = 11",13,10
db " Verzeichnisname im Parameter-Speicher von Janus-Interrupt 26",13,10,10
db " BX = Fehlernummer",13,10
db " 10000 = Okay",13,10
db " <> 10000 = Fehler",13,10
db " CX = Anzahl der Einträge im Parameterspeicher",13,10,10
db "Aufbau der Eintragstabelle:",13,10
db " Offset 0: Dateiname (30 Zeichen)",13,10
db " Offset 30: Länge der Datei als DWORD",13,10
db " Offset 34: Protection-Bits als WORD",13,10
db " Offset 36: Eintragstyp als BYTE",13,10
db " 1 = Datei, sonst Verzeichnis",13,10
db " Offset 37: Erstellungsstunde als BYTE",13,10
db " Offset 38: Erstellungsminute als BYTE",13,10
db " Offset 39: Erstellungssekunde als BYTE",13,10
db " Offset 40: Erstellungstag als BYTE",13,10
db " Offset 41: Erstellungsmonat als BYTE",13,10
db " Offset 42: Erstellungsjahr als WORD",13,10,10
db "<< Taste >>$"
info8 db 13,10
db "Beschreibung des File Transfer-Interrupts auf Vektor 49h: - Seite 8",13,10,10
db "Jeder Eintrag besitzt 44 Bytes. Der erste Eintrag enthält die Daten des",13,10
db "geladenen Verzeichnisses, die folgenden Einträge die Daten der Dateien.",13,10
db "Es sind maximal 372 Einträge vorhanden. Sollte das Verzeichnis mehr Dateien",13,10
db "besitzen, als Einträge vorhanden sind, so wird das Einlesen beim 372.",13,10
db "Eintrag beendet.",13,10,10,10
db "Lock auf Datei oder Verzeichnis (Lock):",13,10
db " AH = 12",13,10
db " Name des Objekts im Parameter-Speicher von Janus-Interrupt 26",13,10,10
db " BX = Lock() ausgeführt",13,10
db " 10000 = Okay",13,10
db " <> 10000 = Fehler",13,10
db " CX = Handlenummer des Lock",13,10,10
db "Lock zurückgeben (UnLock):",13,10
db " AH = 13",13,10
db " BX = Handlenummer des Lock",13,10,10,10
db "<< Taste >>",13,10,"$"
info9 db "Beschreibung des File Transfer-Interrupts auf Vektor 49h: - Seite 9",13,10,10
db "Name mit Laufwerk und allen Unterverzeichnissen für Lock ermitteln:",13,10
db " AH = 14",13,10
db " BX = Handlenummer des Lock",13,10,10
db " BX = Fehlernummer",13,10
db " 10000 = Okay",13,10
db " <> 10000 = Fehler",13,10
db " Name im Parameterspeicher von Janus-Interrupt 26",13,10,10,10
db "Informationen über das Laufwerk, auf das sich ein Lock bezieht, ermitteln:",13,10
db " AH = 15",13,10
db " BX = Handlenummer des Lock",13,10,10
db " BX = Fehlernummer",13,10
db " 10000 = Okay",13,10
db " <> 10000 = Fehler",13,10
db " Tabelle mit Informationen im Parameter-Speicher von Janus-Interrupt 26",13,10,10
db " Beschreibung der Tabelle auf der folgenden Seite.",13,10,10
db "<< Taste >>",13,10,"$"
info10:
db "Beschreibung des File Transfer-Interrupts auf Vektor 49h: - Seite 10",13,10,10
db "Aufbau der Tabelle:",13,10
db " Offset 0: Anzahl der Soft Errors als DWORD (id_NumSoftErrors)",13,10
db " Offset 4: Nummer des Units als DWORD (id_UnitNumber)",13,10
db " Offset 8: Laufwerksstatus als DWORD (id_DiskState)",13,10
db " 80 = Diskette ist schreibgeschützt",13,10
db " 81 = Diskette/Festplatte wird repariert (Validating)",13,10
db " 82 = Diskette/Festplatte ist okay und beschreibbar",13,10
db " Offset 12: Gesamtzahl der Blöcke als DWORD (id_NumBlocks)",13,10
db " Offset 16: Anzahl der belegten Blöcke als DWORD (id_NumBlocksUsed)",13,10
db " Offset 20: Bytes pro Block als DWORD (id_BytesPerBlock)",13,10
db " Offset 24: Laufwerksaktivierung als DWORD (id_InUse)",13,10
db " <> 0 = Laufwerk aktiv",13,10,10,10
db "Aktuelles Verzeichnis setzen (CurrentDir):",13,10
db " AH = 16",13,10
db " Verzeichnisname im Parameter-Speicher von Janus-Interrupt 26",13,10,10
db " BX = Fehlernummer",13,10
db " 10000 = Okay",13,10
db " <> 10000 = Fehler",13,10,10
db "<< Taste >>$"
info11:
db 13,10
db "Beschreibung des File Transfer-Interrupts auf Vektor 49h: - Seite 11",13,10,10
db "Unterverzeichnis erstellen (CreateDir):",13,10
db " AH = 17",13,10
db " Name der Verzeichnisses im Parameter-Speicher von Janus-Interrupt 26",13,10,10
db " BX = CreateDir() ausgeführt",13,10
db " 10000 = Okay",13,10
db " <> 10000 = Fehler",13,10,10,10
db "Datei umbenennen (Rename):",13,10
db " AH = 18",13,10
db " Alter Dateiname im Parameterspeicher ab Offset 0",13,10
db " Neuer Dateiname im Parameterspeicher ab Offset 1000",13,10,10
db " BX = Fehlernummer",13,10
db " 10000 = Okay",13,10
db " <> 10000 = Fehler",13,10,10,10,10,10
db "<< Taste >>",13,10,"$"
info12:
db "Beschreibung des File Transfer-Interrupts auf Vektor 49h: - Seite 12",13,10,10
db "Amiga-Programm starten (Execute):",13,10
db " AH = 19",13,10
db " Befehl im Parameter-Speicher von Janus-Interrupt 26",13,10,10
db " BX = Fehlernummer",13,10
db " 10000 = Okay",13,10
db " <> 10000 = Fehler",13,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10
db "<< Taste >>",13,10,"$"
code ends
end exe_start